package com.zh.work.service.fc.impl;

import com.alibaba.fastjson.JSON;
import com.zh.common.util.OkHttpClientUtil;
import com.zh.work.service.fc.VerifyService;
import com.zh.work.util.fc.CheckParamEncrypt;
import com.zh.work.util.fc.KeyEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import static com.zh.work.constant.url.fc.FcUrl.VERIFY_URL_DEV;
import static com.zh.work.util.fc.CheckParamEncrypt.converMap;

/**
 * code is far away from bug with the animal protecting
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 *
 * @Description: 手机三要素实名认证实现类
 * @Author: Liard
 * @Create in: 2020/7/17 11:24
 * @Version: 1.0.1
 */
@Service
public class VerifyServiceImpl implements VerifyService {

    private static final Logger log = LoggerFactory.getLogger(VerifyServiceImpl.class);


    @Override
    public Map<String, String> yysVerify(String name, String certNo, String phone) throws Exception {
        Map map = new HashMap();
        TreeMap param = new TreeMap();
        // 产品ID
        param.put("product", KeyEnum.YYS_KEY.getProd());
        // 商户编号
        param.put("mid", KeyEnum.MID.getKey());
        // 订单号
        param.put("spOrder", new Date().getTime());
        // 交易时间戳
        param.put("txnDate", new Date().getTime());
        // 户名
        param.put("name", name);
        // 身份证
        param.put("certNo", certNo);
        // 手机号
        param.put("phone", phone);
        // 签名
        param.put("sign", CheckParamEncrypt.md5Encrypt(param, KeyEnum.YYS_KEY.getKey()));
        // 对明文敏感数据加密
        TreeMap enMap = CheckParamEncrypt.encryptParam(param, KeyEnum.YYS_KEY.getKey());
        String url = VERIFY_URL_DEV + converMap(enMap);
        String reqUrl = url.substring(0, url.length() - 1);
        log.info("运营商实名认证最终请求数据为：{}", reqUrl);
        String response = OkHttpClientUtil.getInstance().sendGetRequest(reqUrl);
        // 模拟测试环境,不需要发送真正请求
//        String response = "{\"resCode\":\"0000\",\"resMsg\":\"成功\"}";
        HashMap retMap = JSON.parseObject(response, HashMap.class);
        map.put("data", JSON.toJSONString(retMap));
        if (retMap.get("resCode").equals("0000")) {
            map.put("resCode", 200);
            map.put("success", true);
            map.put("resMsg", retMap.get("resMsg"));
            return map;
        } else {
            map.put("success", false);
            map.put("resMsg", retMap.get("resMsg"));
        }
        log.info("返回结果：{}", retMap);
        return map;
    }

    @Override
    public Map<String, String> ydVerify(String name, String certNo, String phone) throws Exception {
        Map map = new HashMap();
        TreeMap param = new TreeMap();
        // 产品ID
        param.put("product", KeyEnum.YD_KEY.getProd());
        // 商户编号
        param.put("mid", KeyEnum.MID.getKey());
        // 订单号
        param.put("spOrder", new Date().getTime());
        // 交易时间戳
        param.put("txnDate", new Date().getTime());
        // 户名
        param.put("name", name);
        // 身份证
        param.put("certNo", certNo);
        // 手机号
        param.put("phone", phone);
        // 签名
        param.put("sign", CheckParamEncrypt.md5Encrypt(param, KeyEnum.YD_KEY.getKey()));
        // 对明文敏感数据加密
        TreeMap enMap = CheckParamEncrypt.encryptParam(param, KeyEnum.YD_KEY.getKey());
        String url = VERIFY_URL_DEV + converMap(enMap);
        String reqUrl = url.substring(0, url.length() - 1);
        log.info("移动实名认证最终请求数据为：{}", reqUrl);
        String response = OkHttpClientUtil.getInstance().sendGetRequest(reqUrl);
        // 模拟测试环境,不需要发送真正请求
//        String response = "{\"resCode\":\"0000\",\"resMsg\":\"成功\"}";
        HashMap retMap = JSON.parseObject(response, HashMap.class);
        map.put("data", JSON.toJSONString(retMap));
        if (retMap.get("resCode").equals("0000")) {
            map.put("resCode", 200);
            map.put("success", true);
            map.put("resMsg", retMap.get("resMsg"));
            return map;
        } else {
            map.put("success", false);
            map.put("resMsg", retMap.get("resMsg"));
        }
        log.info("返回结果：{}", retMap);
        return map;
    }

    @Override
    public Map<String, String> ltVerify(String name, String certNo, String phone) throws Exception {
        Map map = new HashMap();
        TreeMap param = new TreeMap();
        // 产品ID
        param.put("product", KeyEnum.LT_KEY.getProd());
        // 商户编号
        param.put("mid", KeyEnum.MID.getKey());
        // 订单号
        param.put("spOrder", new Date().getTime());
        // 交易时间戳
        param.put("txnDate", new Date().getTime());
        // 户名
        param.put("name", name);
        // 身份证
        param.put("certNo", certNo);
        // 手机号
        param.put("phone", phone);
        // 签名
        param.put("sign", CheckParamEncrypt.md5Encrypt(param, KeyEnum.LT_KEY.getKey()));
        // 对明文敏感数据加密
        TreeMap enMap = CheckParamEncrypt.encryptParam(param, KeyEnum.LT_KEY.getKey());
        String url = VERIFY_URL_DEV + converMap(enMap);
        String reqUrl = url.substring(0, url.length() - 1);
        log.info("联通实名认证最终请求数据为：{}", reqUrl);
        String response = OkHttpClientUtil.getInstance().sendGetRequest(reqUrl);
        // 模拟测试环境,不需要发送真正请求
//        String response = "{\"resCode\":\"0000\",\"resMsg\":\"成功\"}";
        HashMap retMap = JSON.parseObject(response, HashMap.class);
        map.put("data", JSON.toJSONString(retMap));
        if (retMap.get("resCode").equals("0000")) {
            map.put("resCode", 200);
            map.put("success", true);
            map.put("resMsg", retMap.get("resMsg"));
            return map;
        } else {
            map.put("success", false);
            map.put("resMsg", retMap.get("resMsg"));
        }
        log.info("返回结果：{}", retMap);
        return map;
    }

    @Override
    public Map<String, String> dxVerify(String name, String certNo, String phone) throws Exception {
        Map map = new HashMap();
        TreeMap param = new TreeMap();
        // 产品ID
        param.put("product", KeyEnum.DX_KEY.getProd());
        // 商户编号
        param.put("mid", KeyEnum.MID.getKey());
        // 订单号
        param.put("spOrder", new Date().getTime());
        // 交易时间戳
        param.put("txnDate", new Date().getTime());
        // 户名
        param.put("name", name);
        // 身份证
        param.put("certNo", certNo);
        // 手机号
        param.put("phone", phone);
        // 签名
        param.put("sign", CheckParamEncrypt.md5Encrypt(param, KeyEnum.DX_KEY.getKey()));
        // 对明文敏感数据加密
        TreeMap enMap = CheckParamEncrypt.encryptParam(param, KeyEnum.DX_KEY.getKey());
        String url = VERIFY_URL_DEV + converMap(enMap);
        String reqUrl = url.substring(0, url.length() - 1);
        log.info("电信实名认证最终请求数据为：{}", reqUrl);
        String response = OkHttpClientUtil.getInstance().sendGetRequest(reqUrl);
        // 模拟测试环境,不需要发送真正请求
//        String response = "{\"resCode\":\"0000\",\"resMsg\":\"成功\"}";
        HashMap retMap = JSON.parseObject(response, HashMap.class);
        map.put("data", JSON.toJSONString(retMap));
        if (retMap.get("resCode").equals("0000")) {
            map.put("resCode", 200);
            map.put("success", true);
            map.put("resMsg", retMap.get("resMsg"));
            return map;
        } else {
            map.put("success", false);
            map.put("resMsg", retMap.get("resMsg"));
        }
        log.info("返回结果：{}", retMap);
        return map;
    }


}
